#ifndef THINGSDAO_H
#define THINGSDAO_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDateTime>
#include <QList>
#include <qsqlerror.h>
#include <qjsonarray.h>
#include <qjsonobject.h>
#include <qjsondocument.h>
/*
 *  负责插入或者读取有时间限制的事件，命名为thing
 *  db_id 在服务器中的id
 *  name 事件名称
 *  add_time 添加时间
 *  end_time 截止时间
 *  status 状态，默认为0，即未完成，1 已完成但是未同服务器同步 2是超时 3是已经和服务器同步
 */

class ThingsDao
{
public:
    /**
     * @brief The ThingData struct 用于返回相关信息的结构体
     */
    struct ThingData{
        int id;//序号
        int dbId;//数据库中的id
        QString name;//名称
        QString addTime;//添加时间
        QString endTime;//截止时间
        int status;//状态
    };
    /**
     * @brief ThingsDao 构造一个数据库操作实体
     * @param hostName 主机名称
     * @param dbName 数据库名称
     * @param username 用户名
     * @param password 密码
     * @param tableName 表名
     */
    ThingsDao(QString hostName="z-terminal",QString dbName="thingsCheckers",QString username="zekdot",QString password="123456",QString tableName="thing");
    /**
     * @brief insertItem 插入一个新的事件
     * @param name 名称
     * @param endTime 结束时间
     * @return  插入后的rowid
     */
    int insertItem(QString name,QDateTime endTime);
    /**
     * @brief queryItem 查询所有任务
     * @return 返回任务数据的结构体
     */
    QList<ThingData> queryItem();
    /**
     * @brief finishItem 标记完成一条任务，可以指定结果，1表示成功完成，2表示超时
     * @param id 任务序号
     * @param result 结果
     * @return
     */
    bool setItemStatus(int id,int result);
    /**
     * @brief getThingArray 得到时间的JsonArray
     * @return
     */
    QJsonArray getThingArray();
    /**
     * @brief updateDbId 更新对应的服务端数据库id
     * @param array
     */
    void updateDbId(QJsonArray array);
    /**
     * @brief saveAndRetDelList 根据array进行任务存储或者添加进删除列表
     * @param array 服务器发过来的列表
     * @return 删除列表
     */
    QJsonArray saveAndRetDelList(QJsonArray array);
    /**
     * @brief syncDelThing 将在服务器更新之后的id对应的记录的status改为3
     * @param array id的数组
     */
    void syncDelThing(QJsonArray array);
    /**
     * @brief getDelThings 获取所有状态为1或者2的thing的id列表
     */
    QJsonArray getDelThings();

private:
    QSqlDatabase db;//数据库实体
    QString tableName;//表名
    /**
     * @brief getStatus 根据数据库id获取状态
     * @param dbId 数据库id
     * @return 0--不存在  1--存在但未完成或者已经和服务器同步过  2--已完成
     */
    int getStatus(int dbId);
};

#endif // THINGSDAO_H
